import re
import datetime
import os
from openai import OpenAI
from config.settings import BASE_DIR


def call_ai(messages, max_tokens=4096, temperature=0.2):
    """
    调用DeepSeek AI接口
    """
    DEEPSEEK_KEY = "sk-d34cd6ffbfe3477b98da40cc8f8f4267"
    MODEL = "deepseek-chat"
    
    try:
        client = OpenAI(api_key=DEEPSEEK_KEY, base_url="https://api.deepseek.com/v1")
        
        response = client.chat.completions.create(
            model=MODEL,
            messages=messages,
            max_tokens=max_tokens,
            temperature=temperature,
            stream=False
        )
        return response.choices[0].message.content.strip()
    except Exception as e:
        print(f"调用AI接口时出错: {str(e)}")
        # 返回一个默认的格式，避免程序中断
        return "国内新闻\n1. 默认国内新闻内容\n\n国际新闻\n1. 默认国际新闻内容"


def parse_raw_content(raw_file_path):
    """
    解析原始内容文件，将其分为4个部分
    """
    try:
        # 读取原始内容文件
        with open(raw_file_path, 'r', encoding='utf-8') as f:
            content = f.read()
        
        # 使用正则表达式分割内容为不同板块
        # 查找四个主要部分的内容
        national_international_match = re.search(r'=+\s*国内国际新闻原始内容\s*=+\s*(.*?)(?=\n\s*={7,})', content, re.DOTALL)
        bt_news_match = re.search(r'=+\s*兵团新闻原始内容\s*=+\s*(.*?)(?=\n\s*={7,})', content, re.DOTALL)
        meiye_news_match = re.search(r'=+\s*镁业新闻原始内容\s*=+\s*(.*?)(?=\n\s*={7,})', content, re.DOTALL)
        oil_news_match = re.search(r'=+\s*国际原油原始内容\s*=+\s*(.*?)(?=\n\s*={7,}|$)', content, re.DOTALL)
        
        # 提取各部分内容
        national_international_content = national_international_match.group(1).strip() if national_international_match else ""
        bt_news_content = bt_news_match.group(1).strip() if bt_news_match else ""
        meiye_news_content = meiye_news_match.group(1).strip() if meiye_news_match else ""
        oil_news_content = oil_news_match.group(1).strip() if oil_news_match else ""
        
        # 返回各部分的内容
        return {
            "国内国际新闻原始内容": national_international_content,
            "兵团新闻原始内容": bt_news_content,
            "镁业新闻原始内容": meiye_news_content,
            "国际原油原始内容": oil_news_content
        }
        
    except Exception as e:
        print(f"解析原始内容时出错: {str(e)}")
        import traceback
        traceback.print_exc()
        return {}


def process_split_sections(content):
    """
    处理需要分割的板块内容（今日推荐、观国内、览海外）
    每一行都包含两个用冒号分隔的事件，需要拆分成两行
    """
    # 定义需要分割的板块
    split_sections = ["【今日推荐】", "【观国内】", "【览海外】"]
    
    # 按板块分割内容
    sections = re.split(r'(【[^】]+】)', content)
    
    processed_sections = []
    i = 0
    while i < len(sections):
        if sections[i].strip() in split_sections:
            # 这是一个需要分割的板块
            section_title = sections[i]
            section_content = sections[i+1] if i+1 < len(sections) else ""
            processed_sections.append(section_title)
             
            # 处理板块内容，按行分割并处理每一行
            lines = section_content.strip().split('\n')
            for line in lines:
                line = line.strip()
                if line and "：" in line:
                    # 移除行首的序号（如"1. "）
                    raw = re.sub(r'^\d+\.\s*', '', line)
                     
                    # 分割成两个部分
                    parts = raw.split("：", 1)  # 只分割第一个冒号
                    if len(parts) == 2:
                        part1, part2 = parts
                         
                        # 确保第一部分以句号结尾
                        if not part1.endswith(("。", "！", "？")):
                            part1 += "。"
                             
                        processed_sections.append(part1)
                        # 第二部分可能包含多个冒号，需要处理完整
                        if part2:
                            processed_sections.append(part2)
                    else:
                        # 如果无法分割，保留原行
                        processed_sections.append(line)
                elif line:
                    processed_sections.append(line)
             
            i += 2
        else:
            processed_sections.append(sections[i])
            i += 1

    return "\n".join(processed_sections)


def extract_commodities_content(national_international_content):
    """
    从国内国际新闻内容中提取商品期货内容
    """
    # 使用正则表达式提取【商品期货】板块内容
    pattern = r'【商品期货】\s*(.*?)(?=\n\s*【|\n\s*=|\Z)'
    match = re.search(pattern, national_international_content, re.DOTALL)
    if match:
        return match.group(1).strip()
    return ""


def separate_commodities(commodities_content):
    """
    分离商品期货内容为国内期货和其他期货（国际期货）
    """
    domestic_futures = []
    international_futures = []
     
    if commodities_content:
        lines = commodities_content.strip().split('\n')
        for line in lines:
            line = line.strip()
            # 国内期货行
            if line.startswith("1. 国内期货:") or "国内期货" in line:
                domestic_futures.append(line)
            # 其他行作为国际期货
            elif line and not re.match(r'^\d+\.\s*国内期货:', line):
                # 移除行首的序号
                clean_line = re.sub(r'^\d+\.\s*', '', line)
                if clean_line:
                    international_futures.append(clean_line)
     
    return domestic_futures, international_futures


def summarize_national_international_news(national_international_content):
    """
    总结国内国际新闻内容
    """
    # 处理需要分割的板块
    processed_content = process_split_sections(national_international_content)
    
    # 提取商品期货内容
    commodities_content = extract_commodities_content(national_international_content)
    
    # 分离国内期货和国际期货
    domestic_futures, international_futures = separate_commodities(commodities_content)
    
    # 从processed_content中移除商品期货部分，避免国际期货内容出现在国际新闻中
    # 先找到商品期货部分的开始和结束位置
    commodity_section_start = processed_content.find("【商品期货】")
    if commodity_section_start != -1:
        # 找到下一个板块的开始位置或者文件结尾
        next_section_start = processed_content.find("\n【", commodity_section_start + 1)
        if next_section_start != -1:
            # 移除商品期货部分
            processed_content_without_commodities = processed_content[:commodity_section_start] + processed_content[next_section_start:]
        else:
            # 如果没有下一个板块，直接移除商品期货部分到结尾
            processed_content_without_commodities = processed_content[:commodity_section_start]
    else:
        processed_content_without_commodities = processed_content
    
    # 构建提示词
    prompt = (
        "你是资深财经编辑，请对以下事件进行总结，要求如下：\n"
        "1. 事件粒度：\n"
        "   - 【今日推荐】【观国内】【览海外】板块中有些一行是两个事件，注意辨别，直接保留无需总结\n"
        "   - 【每日精选】【热点题材】板块需要逐条总结，要求总结的简明扼要，保留日期/数字/机构/人名\n"
        "   - 字数太少的直接保留，无需总结\n"
        "2. 去重：语义完全重复的内容只保留首次出现的\n"
        "3. 格式要求：\n"
        "国内新闻\n"
        "1. 事件1\n"
        "2. 事件2\n"
        "…\n\n"
        "国际新闻\n"
        "1. 事件1\n"
        "2. 事件2\n"
        "…\n"
        "4. 严格按上述格式输出，只输出结果，不添加任何额外说明\n\n"
        f"内容如下：\n{processed_content_without_commodities}"
    )
    
    # 调用AI接口
    summary = call_ai([{"role": "user", "content": prompt}])
    
    # 解析AI返回的结果
    lines = summary.splitlines()
    domestic_news = []
    international_news = []
    current_section = None
    
    for line in lines:
        line = line.strip()
        if line == "国内新闻":
            current_section = "domestic"
        elif line == "国际新闻":
            current_section = "international"
        elif current_section == "domestic" and line and re.match(r'^\d+\.', line):
            domestic_news.append(re.sub(r'^\d+\.\s*', '', line))
        elif current_section == "international" and line and re.match(r'^\d+\.', line):
            international_news.append(re.sub(r'^\d+\.\s*', '', line))
     
    return {
        "国内新闻": domestic_news + domestic_futures,  # 国内新闻包括国内期货
        "国际新闻": international_news,
        "国际期货": international_futures  # 国际期货来自商品期货板块除国内期货外的内容
    }


def summarize_bt_news(bt_content):
    """
    总结兵团新闻内容
    """
    if not bt_content.strip():
        return ["1. 默认兵团新闻"]
     
    # 构建提示词
    prompt = (
        "你是资深编辑，请对以下兵团新闻内容进行总结，要求如下：\n"
        "1. 按照每条的内容进行总结，如果内容少于40字，可以不总结，直接保留\n"
        "2. 按照事件总结，每个事件总结为一条\n"
        "3. 每条总结要求简明扼要\n"
        "4. 保留关键信息如地名、人名、机构名、数字等\n"
        "5. 按照以下格式输出，只输出结果，不添加任何额外说明：\n"
        "兵团新闻"
        "1. 要点1\n"
        "2. 要点2\n"
        "…\n\n"
        f"内容如下：\n{bt_content}"
    )
     
    # 调用AI接口
    bt_summary = call_ai([{"role": "user", "content": prompt}])
     
    bt_summaries = []
    if "无重要内容" not in bt_summary:
        bt_lines = bt_summary.strip().split('\n')
        for line in bt_lines:
            if line.strip() and re.match(r'^\d+\.', line):
                bt_summaries.append(re.sub(r'^\d+\.\s*', '', line.strip()))
     
    return bt_summaries if bt_summaries else ["1. 默认兵团新闻"]


def parse_meiye_articles(meiye_content):
    """
    解析镁业新闻内容为单独的文章
    """
    if not meiye_content.strip():
        return []
    
    # 镁业新闻按文章分割
    articles = re.split(r'-{80,}', meiye_content)
    articles = [article.strip() for article in articles if article.strip()]
    return articles


def summarize_single_meiye_article(article_content):
    """
    对单篇镁业新闻进行总结
    """
    # 提取文章标题
    title_match = re.search(r'【标题】:\s*(.+)', article_content)
    title = title_match.group(1) if title_match else "无标题"
    
    # 构建提示词
    prompt = (
        f"文章标题：{title}\n"
        f"文章内容：{article_content[:3000]}\n\n"
        "你是资深编辑，请阅读【内容】中的内容并进行镁业新闻进行总结，要求如下：\n"
        "1. 总结简明扼要\n"
        "2. 保留关键信息如政策名、标准号、机构名、数字等\n"
        "3. 只输出总结结果，不添加任何额外说明"
    )
    
    # 调用AI接口
    summary = call_ai([{"role": "user", "content": prompt}])
    return summary.strip()


def summarize_meiye_news(meiye_content):
    """
    总结镁业新闻（每篇文章单独总结）
    """
    # 解析为单独的文章
    articles = parse_meiye_articles(meiye_content)
    
    meiye_summaries = []
    for i, article in enumerate(articles):
        try:
            summary = summarize_single_meiye_article(article)
            if summary and not summary.startswith("AI总结失败") and "国内新闻" not in summary:
                meiye_summaries.append(summary)  # 不添加序号，避免重复
            else:
                # 如果AI总结失败，尝试提取文章标题作为替代
                title_match = re.search(r'【标题】:\s*(.+)', article)
                title = title_match.group(1) if title_match else f"文章{i+1}"
                meiye_summaries.append(title)
        except Exception as e:
            print(f"总结第{i+1}篇镁业新闻时出错: {str(e)}")
            title_match = re.search(r'【标题】:\s*(.+)', article)
            title = title_match.group(1) if title_match else f"文章{i+1}"
            meiye_summaries.append(title)
            
    return meiye_summaries


def generate_daily_report():
    """
    生成班超早餐日报
    """
    # 获取今天的日期
    today_date = datetime.date.today().strftime("%Y%m%d")
    raw_filename = os.path.join(BASE_DIR, "yuanshineirong", f"原始内容_{today_date}.txt")
    
    # 检查文件是否存在
    if not os.path.exists(raw_filename):
        print(f"文件 {raw_filename} 不存在")
        return
    
    # 解析原始内容
    sections = parse_raw_content(raw_filename)
    
    if not sections:
        print("解析原始内容失败")
        return
    
    # 总结各部分内容
    # 1. 国内国际新闻
    national_international_summary = summarize_national_international_news(sections["国内国际新闻原始内容"])
    
    # 2. 兵团新闻
    bt_summary = summarize_bt_news(sections["兵团新闻原始内容"])
    
    # 3. 镁业新闻
    meiye_summary = summarize_meiye_news(sections["镁业新闻原始内容"])
    
    # 构建最终输出内容
    output_lines = []
    
    # 国内新闻
    output_lines.append("国内新闻")
    for i, news in enumerate(national_international_summary["国内新闻"], 1):
        output_lines.append(f"{i}. {news}")
    output_lines.append("")
    
    # 国际新闻
    output_lines.append("国际新闻")
    for i, news in enumerate(national_international_summary["国际新闻"], 1):
        output_lines.append(f"{i}. {news}")
    output_lines.append("")
    
    # 国际期货
    output_lines.append("国际期货")
    for i, news in enumerate(national_international_summary["国际期货"], 1):
        output_lines.append(f"{i}. {news}")
    output_lines.append("")
    
    # 兵团新闻
    output_lines.append("兵团新闻")
    for i, news in enumerate(bt_summary, 1):
        output_lines.append(f"{i}. {news}")
    output_lines.append("")
    
    # 镁业新闻
    output_lines.append("镁业新闻")
    for i, news in enumerate(meiye_summary, 1):
        output_lines.append(f"{i}. {news}")
    output_lines.append("")
    
    # 保存到文件
    output_content = "\n".join(output_lines)
    summary_filename = os.path.join(BASE_DIR, "zongjie", f"班超早餐-{today_date}.txt")
    
    # 确保zongjie目录存在
    os.makedirs(os.path.dirname(summary_filename), exist_ok=True)
    
    with open(summary_filename, 'w', encoding='utf-8') as f:
        f.write(output_content)
    
    print(f"日报已保存到: {summary_filename}")
    return summary_filename


if __name__ == "__main__":
    generate_daily_report()